<?php
/**
 * Copyright (c) 2009, Microsoft
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of Microsoft nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY Microsoft ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL Microsoft BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   Microsoft
 * @package    WebErrorPHPToolkit
 * @subpackage WebConfigXml
 * @version    $Id: WebConfigXml.php, v 1.0 2009-10-09 08:00:00Z unknown $
 * @copyright  Copyright (c) 2009, Microsoft (http://www.microsoft.com)
 * @author     jeff00seattle
 *
 * Reads and enters values from web.config.xml file.
 */

require_once 'SupportFunctions.php';
require_once 'SiteVariables.php';
require_once 'WebConfigXsd.php';

define('FILTER_MODE_ALL', 0);
define('FILTER_MODE_INCLUDE', 1);
define('FILTER_MODE_EXCLUDE', 2);

/**
 * Reads XML configuration file web.config.xml and loads values into global site variables.
 *
 * @return boolean Success status.
 * @throws If unexpected value type is passed in from web.config.xml.
 */
function web_error_load_web_config()
{
  try
  {
    if(!web_error_validate_web_config())
    {
      throw new WebToolkit_WebConfigXml_Exception("XML document 'web.config.xml' is not valid.");
    }

    if(!$xml = simplexml_load_file('web.config.xml'))
    {
      throw new WebToolkit_WebConfigXml_Exception("Error loading as XML document 'web.config.xml' file.");
    }

    $applicationSettings = $xml->xpath("/configuration/applicationSettings/*");

    foreach($applicationSettings as $setting)
    {
      $config_name = (string)$setting['name'];
      $value = NULL;

      $props = get_object_vars($setting->value);
      foreach ($props AS $prop_name=>$prop_value) {

        switch ($prop_name) {
          case "boolean":
            if (is_string($prop_value)) {
              $prop_value = strtolower($prop_value);
            }

            switch ($prop_value) {
              case "true":
              case 1:
                $value = true;
                break;
              case "false":
              case 0;
                $value = false;
                break;
            }
            break;

          case "integer":
          case "BingWebCount":
            $value = intval($prop_value);
            break;;

          case "stringArray":
            $stringArray = get_object_vars($prop_value);
            if ( is_string($stringArray['string']) ) {
              $value = $stringArray['string'];
            } else if ( is_array($stringArray['string']) ) {
              $value = implode(" ", $stringArray['string']);
            } else {
              continue;
            }
            break;

          case "DomainArray":
            $domainArray = get_object_vars($prop_value);
            if ( is_string($domainArray['domain']) ) {
              $value = $domainArray['domain'];
            } else if ( is_array($domainArray['domain']) ) {
              $value = implode(" ", $domainArray['domain']);
            } else {
              continue;
            }
            break;

          case "enumEnableDisable":
            switch ($prop_value) {
              case "Enable":
                $value = true;
                break;
              case "Disable":
                $value = false;
                break;
            }
            break;

          case "enumAllExcludeInclude":
            switch ($prop_value) {
              case "All":
                $value = FILTER_MODE_ALL;
                break;
              case "Include":
                $value = FILTER_MODE_INCLUDE;
                break;
              case "Exclude":
                $value = FILTER_MODE_EXCLUDE;
                break;
            }
            break;

          case "string":
          case "BingApiVersion":
          case "BingAppID":
          case "ISOLangCountry":
          case "UrlPath":
            $value = $prop_value;
            break;

          default:
            throw new WebToolkit_WebConfigXml_Exception('Unexpected application setting value type.');
            break;
        }
      }

      site_variable_set($config_name, $value);
    }
  }
  catch (WebToolkit_WebConfigXml_Exception $ex)
  {
    throw $ex;
  }
  catch (Exception $ex)
  {
    throw new WebToolkit_WebConfigXml_Exception( $ex->getMessage() );
  }

  return true;
}

/**
 * For gathered web config and bing assets,
 * apply a subset as HTML hidden values.
 *
 * @return boolean
 * @throws If expected site variable is not set.
 */
function web_error_load_hidden_values() {

  $hidden_keys = array(
                   "BingApiVersion",
                   "BingAppID",
                   "BingIncludedDomains",
                   "BingMarket",
                   "BingMaximumResultsCount",
                   "BingSearchImageEnabled",
                   "BingSearchJsonEndpoint",
                   "BingSpellCorrectionEnabled",
                   "Custom404BingEnabled",
                   "Custom404BingConnectTimeout",
                   "Custom404DebugEnabled",
                   );

  foreach($hidden_keys AS $key)
  {
    if (!site_variable_isset($key))
    {
      throw new WebToolkit_WebConfigXml_Exception(sprintf("Site variable '%s' not set", $key));
    }

    $value = site_variable_get($key, null);
    web_error_set_hidden($key, $value);
  }

  return true;
}
?>